
import axios from 'axios'
import qs from 'qs'
import { storage } from './storage'
import { showFailToast } from 'vant'


const JWT_HEADER_KEY = import.meta.env.VITE_AUTH_TOKEN
// create an axios instance
const service = axios.create({
  baseURL: import.meta.env.VITE_BASE_URL,
  timeout: 80000 // request timeout
})

// request interceptor
service.interceptors.request.use(
  (config: any) => {
    let token: string|null = storage.get(JWT_HEADER_KEY)//此处换成自己获取回来的token，通常存在在cookie或者store里面
    if (token) {
      // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
      config.headers[JWT_HEADER_KEY] = token
      // config.headers.Authorization =  token       
    }
    if (config.method === 'get') {
      config.paramsSerializer = function (params: object) {
        return qs.stringify(params, {
          arrayFormat: 'repeat'
        })
      }
    }
    return config
  },
  error => {
    // Do something with request error
    console.log("出错啦", error) // for debug
    Promise.reject(error)
  }
)
// 响应成功的状态集合
const RESPONSE_CODE = [200]

// token 过期
const TOKEN_EXPIRE = [401]
// response interceptor
service.interceptors.response.use(
  (response: any) => {
    const newToken = response.headers[JWT_HEADER_KEY]
    if (newToken) {
      // 将该token设置到vuex以及本地存储中
      storage.set(JWT_HEADER_KEY, newToken)
    }
    // 服务器响应成功
    if (RESPONSE_CODE.includes(response.data.code)) {
      return response.data
    }
    if (TOKEN_EXPIRE.includes(response.data.code)) {
      storage.remove(JWT_HEADER_KEY)
      window.location.href = '/'
      return response.data
    }
   
    showFailToast(response.data?.msg);
    return response.data
  },
  error => {
    console.log('err' + error) // for debug
    let message = '服务异常'
    if (error && error.response) {
      const status = error.response.status
      switch (status) {
        // 401: 未登录
        // 未登录则跳转登录页面，并携带当前页面的路径
        // 在登录成功后返回当前页面，这一步需要在登录页操作。
        case 401:
          message = '未登录'
          break
        // 403 token过期
        // 登录过期对用户进行提示
        // 清除本地token和清空vuex中token对象
        // 跳转登录页面
        case 403:
          message = '登录过期，请重新登录'
          break
        case 404:
          message = '网络请求不存在'
          break
        case 500:
          message = '服务器出现问题'
          break
        default:
          message = error.response.data.message
          break
      }
      showFailToast(message)
      return error
    }

    showFailToast(message)
    return message
  }
)
export default service
export {
  service as axios
}